package ar.edu.utn.frba.dds.tp.homes;

import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frba.dds.tp.code.filtros.PredicateUsuario;
import ar.edu.utn.frba.dds.tp.code.transacciones.Transaccion;
import ar.edu.utn.frba.dds.tp.code.usuarios.Usuario;

import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;


public class TransaccionesHome {

	private static TransaccionesHome instance;
	private static List<Transaccion> transacciones = new ArrayList<Transaccion>();

	public static TransaccionesHome getInstance() {
		if (instance == null) {
			instance = new TransaccionesHome();
		}
		return instance;
	}

	public static void registrar(Transaccion transaccion) {
		transacciones.add(transaccion);
	}
	
	public List<Transaccion> getTransacciones(){
			return transacciones;
	}

	public List<Transaccion> getCompras() {
		return filterWith(new Predicate<Transaccion>() {
			@Override
			public boolean apply(Transaccion transaccion) {
				return transaccion.isCompra();
			}
		});
	}

	public List<Transaccion> getReservas() {
		return filterWith(new Predicate<Transaccion>() {
			@Override
			public boolean apply(Transaccion transaccion) {
				return !transaccion.isCompra();
				//XXX me hace mucho ruido... solo sirve porque hay 2 transacciones, pero no escala.
			}
		});
	}

	private List<Transaccion> filterWith(Predicate<Transaccion> condicion) {
		Iterable<Transaccion> filtrados = Iterables.filter(this.getTransacciones(), condicion);
		return Lists.newArrayList(filtrados);
	}

	public List<Transaccion> getTransaccionesDe(Usuario user, List<Transaccion> transacciones) {
		Iterable<Transaccion> filtrados = Iterables.filter(transacciones, new PredicateUsuario(user));
		return Lists.newArrayList(filtrados);
	}
}
